10978. Давайте поиграем в магию!
Рассмотрим
карточную игру под названием “Говорящая пчела”. Маг располагает n карт
по кругу. Начиная с некоторой позиции, он произносит: A – C – E. Открывает
позицию “E”, а там – туз. Туз из круга выбрасывается, далее маг произносит: T – W – O. Открывается карта в позиции “O”, а
там – двойка. И так далее пока все карты не будут выброшены. Зная произносимые
слова, следует определить первоначальное положение карт.
Вход. Состоит
из нескольких тестов. Первая строка каждого теста содержит число карт n (1 £ n £ 52 ). Следующие n строк содержат
карты, последовательно открываемые магом, и слова, которые он при этом говорит.
Карта кодируется двумя буквами: значением и мастью. Длины произносимых слов не
более 20. Последний тест содержит n = 0 и не обрабатывается.
Выход. Для каждого теста вывести
расположение карт, начиная с точки отсчета.
13
AS ACE
2S TWO
3S THREE
4C FOUR
5C FIVE
6C SIX
7D SEVEN
8D EIGHT
9D NINE
TH TEN
JH JACK
QH QUEEN
KH KING
0
Пример выхода
QH 4C AS 8D KH 2S 7D 5C TH JH 3S 6C 9D
моделирование
В задаче следует произвести
моделирование игры. Начав с нулевой позиции, будем произносить первое слово.
Если его длина равна len, то на позиции len устанавливаем карту, которая ему соответствует. Далее
произносим второе слово. Двигаясь по кругу, подсчитываем только пустые позиции
(позиции, в которых уже расположены карты, пропускаем). Процесс повторяем до
тех пор пока все n карт не будут расположены в массиве res длины n.
Пример
Первое слово ACE содержит три буквы. Положим res[2] = “AS”. Следующее слово TWO содержит
три буквы, присвоим res[5] = “2S”. Третья карта 3S будет расположена в позиции 5 + |THREE| = 5 + 5 = 10. Процесс продолжается до тех пор,
пока все карты не займут своего места.
В массиве res
храним карты. В массив card будем
считывать очередную карту, word –
слово, которое при этом произносится.
char res[53][3];
char card[3], word[21];
Читаем количество карт n.
Обнулим массив res.
while(scanf("%d",&n),n)
{
memset(res,' ',sizeof(res));
ptr = -1;
Читаем пару (карта, слово) и
находим длину слова len = |word|. Циклически двигаемся вперед на len символов, подсчитывая при этом только не занятые позиции
(для которых res[ptr][0] == ' '). После нахождения требуемой позиции ptr, копируем в нее карту командой strcpy.
for(i = 0; i
< n; i++)
{
scanf("%s
%s",card,word);
len = strlen(word);
while(len)
{
ptr++;
if (ptr
>= n) ptr = 0;
if
(res[ptr][0] == ' ') len--;
}
strcpy(res[ptr],card);
}
Выводим требуемую
последовательность карт. После вывода последней карты не должно быть лишних
пробелов.
printf("%s",res[0]);
for(i = 1; i
< n; i++)
printf("
%s",res[i]);
printf("\n");
}